Проект по ВКИАД

Кузьмицкий Владимир

13.12.2020

В качестве темы для исследования я решил выбрать установление корреляции между географическим положением населённых городов Беларуси и структурой их названий. Ещё в начальной школе мне сказали, что в разных областях Беларуси можно проследить, какой город южнее (ближе к Украине) или восточнее (ближе к России), соответственно и Западнее/Севернее. В пример приводили какие-то отдельные названия городов и говорили что-то вроде "так много российских городов называется" или "звучит более украински". И вот я выбрал это темой моего небольшого проектика, решив выяснить, действительно ли города различных регионов Беларуси также различаются в окончаниях своих названий.

Итак, первый этап состоит в том, чтобы найти данные о городах Беларуси. Я, не мудрствуя лукаво, полез на логичный для этого домен

opendata.by

Там я нашёл замечательный датасет с информацией, о городах Беларуси. Вот так выглядит скриншот из excel с этими данными, которые, если верить составителям, актуальны на 2017 год.

image.png

В самом деле выглядит неплохо...тут почти 24 тысячи позиций! Я и не думал, что в нашей прекрасной стране может быть так много населённых пунктов. Только вот есть два маленьких недостатка этого набора данных в рамках решения моей задачи.

* Во-первых, тут присутствует лишняя информация, которую, в целях экономии времени, я бы убрал.

* Во-вторых, тут не указаны географические координаты населённых пунктов, надо бы ещё откуда-то их достать.

Решение первого подпункта довольно очевидно: удаляем ненужные столбцы прямо в MS excel :)

image.png

Я оставил только колонки "вобласць", "раён", "назва па-беларуску", "назва па-расейску" и "osm: node ID". А ещё сохранил это всё в csv формате как punkty_belarusi_cleaned_1.csv

"Что такое node ID?" спросите вы? А я отвечу: это идентификационный номер элемента местности в системе Open Street Maps

C помощью этого номера можно получать информацию об объекте местности с использованием Open Street Maps API. Среди прочего, простым http запросом можно получить информацию и о широте/долготе населённого пункта, что и хочется мне сделать.

Пришло время побаловаться с python: давайте получим информацию о городе Минск по вышеуказанной схеме.

Нас интересуют два указанных поля (на скриншоте выделены красным)

image.png

Несложно догадаться, что получать интересующие нас значения можно с помощью регулярных выражений :) Осталось автоматизировать остальной процесс. Воспользуемся Pandas и загрузим очищенную версию данных как csv.

Только сначала немножко поимпортим.

Загружаем информацию о городах и очищаем её от тех позиций, для которых не удастся прочитать id, а также переименовываем колонки, чтобы код солиднее смотрелся.

Давайте попробуем для каждой указанной позиции получить ширину и долготу, а также сохранить их в две новые колонки

Наученный горьким опытом бесполезного ожидания (больше часа и всё зря!), я распараллелю процесс обработки запросов с помощью asyncio и aiohttp. Теперь всё занимает не более пары минуточек, но чуть подождать всё же придётся.

Приведём чуть в порядок и сохраним

Установление зависимости

Первое, что приходит в голову, это посмотреть на среднее значение широты и долготы для пунктов с одинаковыми окончаниями. Давайте взглянем, какие они вообще бывают

Теперь давайте посчитаем какую-нибудь абстрактную штуку вроде среднего значения широты для того или иного окончания и посмотрим, насколько действительно различаются эти показатели.

Так не очень понятно, что к чему, давайте используем min-max feature scaling

А теперь давайте проведём небольшую визуализацию происходящего с использованием matplotlib. Для начала напишем вот такой непримечательный блок кода.

Теперь построим карту, которая будем иллюстрировать распределение городов на территории нашей страны в зависимости от двух последних букв в окончании. Для наглядности пока возьмём 5 самых распространённых, но никто не мешает с этим делом поиграться.

Пока приведём субъктивно-визуальную оценку: явно можно выделить "более зелёный" регион у российских границ, "более красный" у латвийских границ, "более синий" у литовских и "рыженькое уплотнение" у польских. Возможно, дело в плотности городов, но всё ещё раскрас довольно дифференцированный получается.

Как я уже говорил, можно построить карту по отдельному окончанию. Смотрите, как устроено распределение по окончанию "цы"

Вновь визуально получаем уплотнение на границе с Литвой. Забавненько

Давайте выделим "победителей"

У Польши "начыкано" больше :)

Вновь же, пока всё сугубо визуально

Давайте просто бахнем сразу все города. Получим прдеставление о плотности городов в Беларуси...согласно датасету)

Внимательный читатель заметит, что написанная мной функция может принимать не только окончания, но и любые другие уместные функции для анализа. Давайте посмотрим, где больше всего белорусы нашипилявили.

Забавное уплотнение у польских и литовских границ)

Чисто из любопытства, подробнее глянем, где тот самый город с тремя буковками ш)

Где-то там находится посёлок Зашляшша)

Давайте ещё ради любопытства построим карту по количеству символов в названии

Ну тут уже совсем сходу можно понять, что ГП и кол-во символов в названии почти независимы. Нет каких-то ярких групп, кроме красно-зелёного скопления к северо-западу от Минска, но думаю, и оно вызвано плотностью поселений в этом регионе.

Ну и если совсем поехать кукухой нечего делать, можно глянуть на распределение по употреблению букв й и ё.

йокать на границах с Литвой привычнее)

А ёкать по всей стране любят...Полесье чуть халтурит только...или датасет)

Давайте проведём все-таки какой-нибудь честный статистический анализ. Вернёмся подробнее к теме окончаний.

Предлагаю разбить территорию нашей страны на равномерные регионы по долготе и высоте, то есть сделать, скажем,

29 отрезочков одинаковой длины (я буду делать только по долготе, можно аналогично и по широте) и посчитать в них количество городов с тем или иным окончанием.

Естественно, тут может помешать различная плотность городов в регионах, поэтому будем считать "плотность городов с определённым окончанием", а именно: делить на количество всех городов в регионе.

Это немного странно выглядит...но, видимо, это так в силу простоты и понятности подхода) Вроде бы забавно и здоровью не угрожает, значит, можно попробовать. Пробуем.

Подготовим датафрейм

Теперь пройдёмся по нашим данным и высчитаем плотность для каждого окончания

Давайте теперь дадим каждому региону среднее значение долготы (ср. арифм.) и высчитаем коэффициент корреляции Пирсона для каждого из окончаний (доля городов с данным окончанием в регионе к средней долготе региона)

На мой взгляд визульное впечатление для некоторых окончаний (у которых по модулю более 0.7) неплохо так оправдалось с точки зрения очень грубой и странноватой статистической модели :) Получаем, что для действительно распространённых окончаний городов ki, чы, ка имеет место достаточно сильная корреляция с их долготой. Хотя, как мы видим, это справедливо не для всех позиций.......ну или надо было бы отдельно рассмотреть по широте зависимость, но этого я делать пока не буду. Давайте я просто приведу отдельные карты для самых выдающихся окончаний (по долготе).

Давайте ещё подробнее взглянем на какое-нибудь равномерное распределение, скажем, "ча" (~0.15 по Пирсону)

Тут уже, в отличие от предыдущих карт сразу наблюдается почти равномерное распределение городов.

Многие их этих результатов достаточно просто объясняются историческими фактами, но теперь я, например, смогу действительно подтвердить, что такая зависимость существует, а не отговорится чем-то аля "в началке мне сказали". Мне кажется, что мне удалось статистически подтвердить существование зависимости между географическим положением населённых пунктов Беларуси и их названием.

Схожие штуки можно провернуть и по остальным параметрам (с которыми мы баловались на картах выше), но у меня пока на этом всё)

Спасибо за внимание!